package com.open.httpauto;


import cn.hutool.http.HttpResponse;
import com.open.httpauto.http.Http;
import com.open.httpauto.http.ParameterBase;

/**
 * http 请求控制
 */
public interface IHttpHandler<T extends ParameterBase> {

    /**
     * 通过 yml 名称 自动扫描 yml 配置，并实现 http 数据的
     * 读取，将读取后的对象 再完成请求
     *
     * @param httpId yaml中对应的 httpId
     * @param t      泛型自定义数据 需要继承 {@link ParameterBase}
     * @param rClazz 返回要求的类型 class
     * @return HttpRequest
     */
    HttpRequest request(String httpId, T t, Class<? extends ParameterBase> rClazz);

    /**
     * 请求
     * 请求时需要传入 返回类型 class，自动
     * 转化返回结果
     *
     * @param http   http全局信息 通过yaml转化而来
     * @param t      请求泛型扩展参数，需要继承 {@link ParameterBase}
     * @param rClazz 返回要求的类型 class
     * @param <R>    泛型返回类型
     * @return R
     */
    <R> R request(Http http, T t, Class<? extends ParameterBase> rClazz);

    /**
     * 前置请求
     *
     * @param http   http全局信息 通过yaml转化而来
     * @param t      请求泛型扩展参数，需要继承 {@link ParameterBase}
     * @param rClazz 返回要求的类型 class
     * @param <R>    泛型返回类型
     * @return R
     */
    <R> R preHandle(Http http, T t, Class<? extends ParameterBase> rClazz);

    /**
     * 后置请求
     *
     * @param http   http全局信息 通过yaml转化而来
     * @param t      请求泛型扩展参数，需要继承 {@link ParameterBase}
     * @param rClazz 返回要求的类型 class
     * @param <R>    泛型返回类型
     * @return R
     */
    <R> R afterCompletion(Http http, T t, Class<? extends ParameterBase> rClazz);

    /**
     * 执行请求
     *
     * @return 响应结果
     */
    <R> R execute();


    /**
     * 请求
     *
     * @param host        请求接口
     * @param method      http方法如：post,get
     * @param contentType 请求数据类型
     * @param param       参数
     * @return 响应结果
     */
    default HttpResponse request(String host, String method, String contentType, String param) {
        HttpMethodEnum httpMethod = HttpMethodEnum.getEnum(method);

        cn.hutool.http.HttpRequest httpRequest = null;
        if (HttpMethodEnum.GET == httpMethod) {
            host = host.endsWith("?") ? host + param : host + "?" + param;
            httpRequest = cn.hutool.http.HttpRequest.get(host);
        } else if (HttpMethodEnum.POST == httpMethod) {
            httpRequest = cn.hutool.http.HttpRequest.post(host).body(param);
        }

        HttpResponse httpResponse = httpRequest.contentType(contentType).execute();
        return httpResponse;
    }
}
